package fr.cdesire.sudoku.applet.action;

import fr.cdesire.sudoku.applet.exception.SudokuAppletException;
import fr.cdesire.sudoku.applet.utils.Message.MessageEnum;
import fr.cdesire.sudoku.core.exceptions.GrilleIncompleteException;
import fr.cdesire.sudoku.core.exceptions.GrilleInvalideException;
import fr.cdesire.sudoku.core.exceptions.GrillePlusieursSolutionsException;
import fr.cdesire.sudoku.core.exceptions.GrilleSansSolutionsException;
import fr.cdesire.sudoku.core.exceptions.SudokuCoreException;

public class ChercherSolutionAction extends AbstractSudokuAction {
	
	private final long startTime;
	
	public ChercherSolutionAction() {
		super();
		this.startTime = System.currentTimeMillis();
	}

	@Override
	public void execute(String json) throws SudokuAppletException {

		try {	
			grilleManager.update(json);
			// TODO A tester en live
			grilleManager.validerGrille();
			grilleManager.rechercheSolution();
			grilleManager.getMessage().update(MessageEnum.MESSAGE_SOLUTION_TROUVEE, System.currentTimeMillis() - startTime);

		} catch (SudokuCoreException e) {
			if (e instanceof GrilleIncompleteException) {
				grilleManager.getMessage().update(MessageEnum.MESSAGE_ERREUR_GRILLE_INCOMPLETE);
			} else if (e instanceof GrilleInvalideException) {
				grilleManager.getMessage().update(MessageEnum.MESSAGE_ERREUR_GRILLE_INVALIDE, 
						((GrilleInvalideException)e).getPremierePosition().getLigne(), 
						((GrilleInvalideException)e).getPremierePosition().getColonne(),
						((GrilleInvalideException)e).getSecondePosition().getLigne(),
						((GrilleInvalideException)e).getSecondePosition().getColonne());	
			} else if (e instanceof GrillePlusieursSolutionsException) {
				grilleManager.getMessage().update(MessageEnum.MESSAGE_ERREUR_GRILLE_PLUSIEURS_SOLUTION);
			} else if (e instanceof GrilleSansSolutionsException) {
				grilleManager.getMessage().update(MessageEnum.MESSAGE_ERREUR_GRILLE_AUCUNE_SOLUTION);
			}
		}
	}
}
